/**
 * @apclass 装饰器函数，用于注册Component的子类
 *
 * 该装饰器函数的目的在于确保传入的构造函数是Component类的子类，并将其注册到registryComponent中
 *
 * @param {T} constructor - 一个构造函数，它必须是Component类的子类
 * @throws {TypeError} 如果传入的构造函数不是Component的子类，则抛出类型错误
 */
export { _decorator } from './lib/_decorator';

/**
 * find函数用于在节点注册表中查找特定的（entity）元素，返回对应的节点实例。
 *
 * @example
 * ```typescript
 * find(world.querySelector("#实体名称")!)?.addComponent(new MovementComponent());
 * ```
 */
export { find } from './lib/Registry';

/**
 * EntityNode类：节点是最基础的场景元素容器，具有事件功能，相当于游戏世界的原子单位。需挂载自任意Entity
 * 它用于封装场景中的基本元素，例如角色、道具、UI等。
 * 每个扩展节点可以包含多个组件（Component），并通过组件实现具体的功能。
 *
 * @example
 * ```typescript
 * const node = new EntityNode(world.querySelector("#实体名称")!);
 * node.addComponent(new MovementComponent());
 * ```
 */
export { EntityNode } from './lib/EntityNode';

/**
 * Component类：所有组件类的基类，提供组件的基本功能和接口。
 * 组件是节点的功能扩展单元，每个组件负责实现特定的功能。
 * 例如，渲染组件负责绘制，物理组件负责碰撞检测，脚本组件负责逻辑控制。
 *
 * @example
 * ```typescript
 * class RenderComponent extends Component {
 *   render() {
 *     // 实现渲染逻辑
 *   }
 * }
 *
 * const node = new EntityNode(new UiNode());
 * node.addComponent(RenderComponent);
 * ```
 */
export { Component } from './lib/Component';

/**
 * NodeSystem类：系统是游戏逻辑的容器，负责管理一组相关的组件和节点。
 * 系统通常用于实现游戏中的特定逻辑，例如物理系统、渲染系统、AI系统等。
 * 每个系统可以处理多个节点及其组件，以实现复杂的游戏行为。
 *
 * @example
 * ```typescript
 * class PhysicsSystem extends NodeSystem {
 *   update(deltaTime: number) {
 *      for (const entitie of this.entities) {
 *          // 实现物理更新逻辑
 *      }
 *   }
 * }
 *
 * const physicsSystem = new PhysicsSystem();
 * physicsSystem.addEntityNode(node);
 * physicsSystem.addEntityNode(node2);
 * ```
 */
export { NodeSystem } from './lib/NodeSystem';

/**
 * EventEmitter类：事件发射器，用于实现观察者模式。
 * 提供事件的订阅、发射和取消订阅等功能。
 *
 * @example
 * ```typescript
 * // 使用全局事件总线，与节点模块无冲突
 * Emitter.on('tick', (deltaTime) => {
 *   console.log(`Tick event triggered, deltaTime: ${deltaTime}`);
 * });
 *
 * Emitter.emit('tick', 0.016);
 *
 * // 或者创建自己的事件发射器实例
 * const myEmitter = new EventEmitter();
 * myEmitter.on('customEvent', (data) => {
 *   console.log(data);
 * });
 * ```
 */
export { EventEmitter, Emitter } from './lib/Observer/EventEmitter';
export { IEvent } from './lib/Observer/Interface';

/**
 * 服务端世界游戏事件的实例化。
 *
 * GameWorldEvent 是一个 {@link GameWorld} 世界管理相关事件实例，用于处理与游戏世界相关的事件。
 * 它允许通过 `on`、`once`、`off` 等方法注册或移除事件监听器，并支持事件的触发和通知。
 *
 * 示例用法：
 * ```typescript
 * // 注册事件监听器，当玩家加入游戏时触发
 * GameWorldEvent.on(world.onPlayerJoin, ({ entity }) => {
 *   console.log(entity.player.name);
 * });
 * ```
 */
export { GameWorldEvent } from './lib/Observer/GameEvent';

/**
 * IBasePerformanceData接口：性能监控的基础数据结构。
 * 提供组件性能监控所需的基本指标，包括执行时间、警告计数和性能趋势等。
 *
 * @example
 * ```typescript
 * // 获取组件的性能数据
 * const performanceData = node.getComponentPerformance("MovementComponent");
 * if (performanceData) {
 *   console.log(`平均执行时间: ${performanceData.averageExecutionTime}ms`);
 *   console.log(`性能趋势: ${performanceData.performanceTrend}`);
 * }
 * ```
 */
export { IBasePerformanceData } from './lib/PerformanceMonitor';

/**
 * IonPerformanceData接口：扩展自IBasePerformanceData，提供与实体节点相关的性能监控数据。
 * 除了基本的性能指标外，还包含实体节点的引用，用于更详细的性能分析。
 *
 * @example
 * ```typescript
 * // 获取实体节点的性能数据
 * EntityNode.onPerformanceWarning(({ component, executionTime }) => {
 *  console.warn(`执行时间: ${executionTime}ms`);
 * });
 * ```
 */
export { IonPerformanceData } from './lib/PerformanceMonitor';

/**
 * NodeTime类：用于管理全局节点/系统的时间相关功能。
 * 提供时间更新、时间流速等功能。
 * - 时间更新默认为开启状态。
 *
 * @example
 * ```typescript
 * // 停止时间更新，
 * NodeTime.stop();
 *
 * // 开启时间更新，
 * NodeTime.start();
 * ```
 */
export { NodeTime } from './lib/Time';
